package com.woniu113.junk.order.controller;


import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.woniu113.junk.commons.model.Result;
import com.woniu113.junk.commons.util.RedisUtil;
import com.woniu113.junk.commons.util.TokenUtil;
import com.woniu113.junk.order.dto.ComplaintDTO;
import com.woniu113.junk.order.dto.ComplaintInfoDTO;
import com.woniu113.junk.order.form.AddComplainInfoForm;
import com.woniu113.junk.order.form.FindComplainInfoForm;
import com.woniu113.junk.order.model.ComplaintInfo;
import com.woniu113.junk.order.param.AddComplainInfoParam;
import com.woniu113.junk.order.param.FindComplainInfoParam;
import com.woniu113.junk.order.service.ComplaintInfoService;
import com.woniu113.junk.order.util.Data;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 蜡笔没了小新
 * @since 2024年10月16日
 */
@RestController
@RequestMapping("/complaintInfo")
@Api(tags = "投诉相关接口")
public class ComplaintInfoController {
    @Resource
    private ComplaintInfoService cis;
    @Resource
    private RedisUtil redisUtil;

    /**
     * 新增投诉信息
     *
     * @param form 用于新增投诉的表单数据
     * @return 返回操作结果，包含新增的投诉信息
     * @author 小周
     * @date 2024/10/18
     */
    @PostMapping("/complain")
    @ApiOperation(value = "新增投诉信息", notes = "用于新增投诉并返回结果")
    public Result<ComplaintInfo> complain(@RequestBody AddComplainInfoForm form) {
        cis.complain(BeanUtil.toBean(form, AddComplainInfoParam.class));
        return Result.getResult(ComplaintInfo.class).setCode(200).setMsg("新增投诉信息成功");
    }

    /**
     * 处理成功的投诉信息
     *
     * @param complainId 投诉信息的唯一标识
     * @param dealMethod 处理方法说明
     * @return 返回处理结果，包含更新后的投诉信息
     * @author 小周
     * @date 2024/10/18
     */
    @GetMapping("/dealWith")
    @ApiOperation(value = "处理成功的投诉信息", notes = "通过投诉ID处理投诉信息为已解决")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "complainId", value = "投诉信息的唯一标识", required = true, dataType = "Integer", paramType = "query"),
            @ApiImplicitParam(name = "dealMethod", value = "处理方法说明", required = true, dataType = "String", paramType = "query")
    })
    public Result<ComplaintInfo> handleSuccess(@RequestParam("complainId") Integer complainId, @RequestParam("dealMethod") String dealMethod) {
        ComplaintInfo complaintInfo = cis.getById(complainId);
        // 检查投诉信息是否存在
        if (complaintInfo == null) {
            return Result.getResult(ComplaintInfo.class).setCode(404).setMsg("投诉信息不存在");
        }
        complaintInfo.setComplaintState(Data.COMPLAIN_INFO_STATE_OVER);
        complaintInfo.setDealMethod(dealMethod);
        cis.updateById(complaintInfo);
        return Result.getResult(ComplaintInfo.class).setCode(200).setMsg("投诉信息处理结果为已解决");
    }

    /**
     * 处理失败的投诉信息
     *
     * @param complainId 投诉信息的唯一标识
     * @param failCause 失败原因说明
     * @return 返回处理结果，包含更新后的投诉信息
     * @author 小周
     * @date 2024/10/18
     */
    @GetMapping("/dealWith/{complainId}/{failCause}")
    @ApiOperation(value = "处理失败的投诉信息", notes = "通过投诉ID处理投诉信息为未解决")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "complainId", value = "投诉信息的唯一标识", required = true, dataType = "Integer", paramType = "path"),
            @ApiImplicitParam(name = "failCause", value = "失败原因说明", required = true, dataType = "String", paramType = "path")
    })
    public Result<ComplaintInfo> handleFailed(@PathVariable Integer complainId, @PathVariable String failCause) {
        ComplaintInfo complaintInfo = cis.getById(complainId);
        // 检查投诉信息是否存在
        if (complaintInfo == null) {
            return Result.getResult(ComplaintInfo.class).setCode(404).setMsg("投诉信息不存在");
        }
        complaintInfo.setFailCause(failCause);
        cis.updateById(complaintInfo);
        return Result.getResult(ComplaintInfo.class).setCode(200).setMsg("投诉信息处理结果为未解决");
    }

    /**
     * 开始处理投诉
     * */
    @GetMapping("/startWork")
    @ApiOperation(value = "开始处理投诉", notes = "开始处理投诉")
    public Result<ComplaintInfo> startWork(@RequestParam("complaintId") Integer complaintId){
        ComplaintInfo complaintInfo = cis.getById(complaintId);
        // 检查投诉信息是否存在
        if (complaintInfo == null) {
            return Result.getResult(ComplaintInfo.class).setCode(404).setMsg("投诉信息不存在");
        }
        //修改状态为未解决
        complaintInfo.setComplaintState(Data.COMPLAIN_INFO_STATE_FAIL);
        cis.updateById(complaintInfo);
        return Result.getResult(ComplaintInfo.class).setCode(200).setMsg("开始处理投诉");
    }


    /**
     * 查询符合条件的投诉信息(用户查询)
     *
     * @param form 查询条件的表单数据
     * @return 返回分页查询结果，包含符合条件的投诉信息
     * @author 小周
     * @date 2024/10/18
     */
    @PostMapping("/find")
    @ApiOperation(value = "查询符合条件的投诉信息", notes = "通过查询条件获取符合条件的投诉信息")
    public Result<List<ComplaintInfoDTO>> find(@RequestBody FindComplainInfoForm form,@RequestHeader String token) throws Exception {
        int userId = Integer.parseInt(TokenUtil.parseToken(redisUtil.get(token)).get("userId").toString());
        FindComplainInfoParam param = BeanUtil.toBean(form, FindComplainInfoParam.class);
        param.setUserId(userId);
        ComplaintDTO complaintDTO = cis.find(param);
        return Result.getListResult(ComplaintInfoDTO.class).setMsg("查询当前登录用户投诉成功").setData(complaintDTO.getDtos()).setTotal(complaintDTO.getTotal());
    }

    /**
     * 查询符合条件的投诉信息(管理员查询)
     *
     * @param form 查询条件的表单数据
     * @return 返回分页查询结果，包含符合条件的投诉信息
     * @author 小周
     * @date 2024/10/18
     */
    @PostMapping("/findByAdmin")
    @ApiOperation(value = "查询符合条件的投诉信息", notes = "通过查询条件获取符合条件的投诉信息")
    public Result<List<ComplaintInfoDTO>> findByAdmin(@RequestBody FindComplainInfoForm form){
        FindComplainInfoParam param = BeanUtil.toBean(form, FindComplainInfoParam.class);
        ComplaintDTO complaintDTO = cis.find(param);
        return Result.getListResult(ComplaintInfoDTO.class).setMsg("查询投诉成功").setData(complaintDTO.getDtos()).setTotal(complaintDTO.getTotal());
    }

    /**
     * 查询自己的符合条件的投诉信息(骑手查询)
     */
    @PostMapping("/findByRider")
    @ApiOperation(value = "查询自己的符合条件的投诉信息(骑手查询)", notes = "查询自己的符合条件的投诉信息(骑手查询)")
    public Result<List<ComplaintInfoDTO>> findByRider(@RequestBody FindComplainInfoForm form,@RequestHeader String token) throws Exception{
        int adminId = Integer.parseInt(TokenUtil.parseToken(redisUtil.get(token)).get("userId").toString());
        System.out.println("当前登录骑手id"+adminId);
        FindComplainInfoParam param = BeanUtil.toBean(form, FindComplainInfoParam.class);
        param.setUserId(adminId);
        ComplaintDTO complaintDTO = cis.findByRider(param);
        return Result.getListResult(ComplaintInfoDTO.class).setMsg("查询自己的符合条件的投诉信息成功").setData(complaintDTO.getDtos()).setTotal(complaintDTO.getTotal());
    }
}

